angular.module('eYe')	
	.factory('Connexion', function ($route, $rootScope, $location, DataBase, safeApply, Historique, Popup, PATH) {
		var Connexion = {
			tabMessage : [
				'',
				'Le login ou le mot de passe saisi est incorrect',				
				'Vous êtes en mode hors ligne',
				'Saisissez un mot de passe',
				'Saisissez un identifiant de connexion'			
			],
			tempsMaxConnexion : 30,
			invite : false
		};

		Connexion.afficherConnexion = function(numMessage){
		
			$rootScope.url_connexion = './'+cheminPages+'connexion.html';
			$rootScope.message_connexion = Connexion.tabMessage[numMessage];
						
			DataBase.BD_Donnees_Utilisateur.Utilisateurs.toArray().then(function(utilisateurs){	
			
				if(utilisateurs.length > 0){					
					$rootScope.listeComptes = utilisateurs;
					$rootScope.listeComptes.unshift({id:-1,login:'-- Selectionner un Compte -- '});
					$rootScope.compteSelectionne = $rootScope.listeComptes[0];
					$rootScope.ajout_compte = false; 					
				}
				else{					
					$rootScope.ajout_compte = true;						
				}			
				safeApply($rootScope);		
				
				$('#cache_chargement').hide();
			});
		}
		
		Connexion.cacherConnexion = function(){
			$('#cache_chargement').show();			
			$rootScope.url_connexion = '';		
			safeApply($rootScope);			
			$route.reload();				
		}

		Connexion.afficherCacheConnexion = function(message){
			if(typeof message === 'undefined'){
				message = 'Chargement en cours ...';
			}
			$('#message_chargement').text(message);
			$('#cache_chargement').show();
			$('#message_chargement').css('left',(($('#cache_chargement').width()/2)-($('#message_chargement').width()/2))+'px');
 			$('#message_chargement').css('top',((($('#cache_chargement').height()/2)-($('#message_chargement').height()/2))+30)+'px');
		}

		Connexion.cacherCacheConnexion = function(){
			$('#cache_chargement').hide();
		}
		
		Connexion.verifierConnexion = function(){

			Offline.options = {checks: {xhr: {url: 'test.html?rand='+Math.floor((Math.random()*10000)+1)}}};
			Offline.check();
			
			if(Connexion.invite){
				return true;
			}
			
			return $.when(DataBase.getValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,'est_connecte',true)).then(function(utilisateur){
			
				if(utilisateur.length == 0 || utilisateur.length > 1){
					utilisateurActuel = {};	
					setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);					
					return false;
				}
				else{
				
					utilisateur = utilisateur[0];
				
					var dateActuelle = new Date();
					var dateDerniereAction = new Date();					
					dateDerniereAction.setTime(utilisateur.date_derniere_action);
					
					var diffDate = dateDiff(dateDerniereAction,dateActuelle);				
					
					if(diffDate.min >= Connexion.tempsMaxConnexion){	
						return $.when(DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateur.id,'est_connecte',false)).then(function(){
							utilisateurActuel = {};
							setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);														
							return false;						
						});						
					}			
					else{					
						utilisateurActuel = utilisateur;					
						return $.when(DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'date_derniere_action',dateActuelle.getTime())).then(function(){						
							Connexion.typeCompte('connecte');
							setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);	
							return true;
						});						
					}
				}						
			});		
		}
		
		Connexion.connexion = function(){

			$rootScope.message_connexion = '';

			if($('#login_connexion').val() == '' && $('#select_compte option:eq(0)').is(':selected')){				
				$rootScope.message_connexion = Connexion.tabMessage[4];
				return false;
			}

			if($('#motdepasse_connexion').val() == ''){
				$rootScope.message_connexion =Connexion.tabMessage[3];
				return false;
			}

		 	var mdp = $('#motdepasse_connexion').val();		 	
			
		 	if( (Offline.state == 'up') && ($rootScope.ajout_compte)){

		 		var login = $('#login_connexion').val();

		 		$.ajax({
					url:PATH.back+'connexion',
					dataType:'json',
					type:'POST',
					async:false,
					data:{login:login,mdp:md5(mdp)},
					success:function(data){	
													
						if(typeof data.id !== 'undefined'){
					
							DataBase.BD_Donnees_Utilisateur.Utilisateurs.toArray().then(function(utilisateurs){		
								utilisateurs.forEach(function(utilisateur){
									utilisateur.est_connecte = false;
								});								
						
								var dateActuelle = new Date();
	
								utilisateurActuel = new Utilisateur({
									id: data.id,
									mot_de_passe: data.mot_de_passe,									
									login: data.login,
									date_derniere_action: dateActuelle.getTime(),
									est_connecte: true
								});

								setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);

								$.when(DataBase.getValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,'id',utilisateurActuel.id)).then(function(utilisateur){									
									
									if(utilisateur.length == 0){
										DataBase.BD_Donnees_Utilisateur.Utilisateurs.add(utilisateurActuel);
								
										return DataBase.BD_Donnees_Utilisateur.saveChanges(function(){
											//Historique.vider();
											Connexion.typeCompte('connecte');	
											Connexion.cacherConnexion();
											DataBase.synchronisationStats(); 
										});
									}
									else{
										var dateActuelle = new Date();
										$.when(
											DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'date_derniere_action',dateActuelle.getTime()),
											DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'est_connecte','true')
										).then(function(){
											Connexion.typeCompte('connecte');	
											Connexion.cacherConnexion();	
											DataBase.synchronisationStats(); 							
										});			
									}
								});
								
							});
						}
						else{
							$rootScope.message_connexion = Connexion.tabMessage[1];
							safeApply($rootScope);
						}
					},
					error:function(){
						$rootScope.message_connexion = Connexion.tabMessage[2];
						safeApply($rootScope);
					}
				});

		 	}
		 	else if(!$rootScope.ajout_compte){
		 		
				var login = $('#select_compte option:selected').text();
		
		 		$.when(DataBase.getValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,'login',login)).then(function(utilisateur){
		 			
					utilisateur = utilisateur[0];
					
		 			if(md5(mdp) == utilisateur.mot_de_passe){
						
			 			utilisateurActuel = utilisateur;
						setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);
						DataBase.BD_Donnees_Utilisateur.Utilisateurs.toArray().then(function(utilisateurs){		
							utilisateurs.forEach(function(utilisateur){
								utilisateur.est_connecte = false;
							});
							return DataBase.BD_Donnees_Utilisateur.saveChanges();
						}).then(function(){
							var dateActuelle = new Date();
							$.when(
								DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'date_derniere_action',dateActuelle.getTime()),
								DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'est_connecte','true')
							).then(function(){
								Connexion.typeCompte('connecte');	
								Connexion.cacherConnexion();
								DataBase.synchronisationStats(); 								
							});				 			
				 		});
				 	}
				 	else{				 		
						$rootScope.message_connexion = Connexion.tabMessage[1];
						safeApply($rootScope);
				 	}	
		 		});	 	
		 	}
			else{
				$rootScope.message_connexion = Connexion.tabMessage[2];
			}			
		}
		
		Connexion.ajouterCompte = function(){
			$rootScope.ajout_compte = true;
		}
		
		Connexion.inscprition = function(){
			location.href = PATH.back+'register';
		}
		
		Connexion.connexionInvite = function(){
			
			var config = {
				typePopup:'autre',
				message:'Connexion en tant qu\'invité :<br><br>Vous pourrez répondre aux QCM mais aucune statistique ne sera sauvegardée.<br><br>Voulez-vous continuer ?',
				btn_fermer:false,
				btn_oui_non:true,
				fonctionReponse:function(reponse){
					if(reponse){												
						Connexion.typeCompte('invite');						
						Connexion.cacherConnexion();
					}
				}
			};
			
			Popup.afficherPopup(config);
			
		}

		Connexion.typeCompte = function(type){
			
			if(type == 'non_connecte'){
				$('#aff_compte').hide();
				$('#aff_invite').hide();
				$('#aff_non_connecte').show();
				$('#aff_compte #intule_connexion').text('');
				Connexion.invite = false;
			}
			else if(type == 'invite'){
				$('#aff_compte').hide();
				$('#aff_invite').show();
				$('#aff_non_connecte').hide();
				$('#aff_compte #intule_connexion').text('');
				Connexion.invite = true;
			}
			else if(type == 'connecte'){
				$('#aff_compte').show();
				$('#aff_invite').hide();
				$('#aff_non_connecte').hide();
				$('#aff_compte #intule_connexion').text(utilisateurActuel.login);
				Connexion.invite = false;
			}
		}

		Connexion.deconnexion = function(){				
			$.when(DataBase.setValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Utilisateurs,utilisateurActuel.id,'est_connecte','false'))
				.then(function(){
					utilisateurActuel = {};
					setVariableLocalStorage('utilisateurActuel',utilisateurActuel,true);

					Connexion.typeCompte('non_connecte');

					if(location.hash == '#/'){
						$route.reload();
					}
					else{
						location.hash = '/';
					}				
				}
			);
			
		}

		return Connexion;
	});